package Array;

/**
 *88. 合并两个有序数组
 *
 * 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2，另有两个整数 m 和 n ，分别表示 nums1 和 nums2 中的元素数目。
 *
 * 请你 合并 nums2 到 nums1 中，使合并后的数组同样按 非递减顺序 排列。
 *
 * 思路： 参考题意，nums1的大小是m+n， 由于数组已经是拍好序的，所以我们可以反向思考，从末尾向前排序，这样确保合并的过程是递减的。
 *       定义双指针，分别指向两个数组的末尾, 然后再定义一个指针，指向nums1中存放元素的位置
 *       当一个数组存放完后，再将另一个数组的剩余元素存放进去，已经是在nums1数组中操作，所以我们直接关注nums2剩余多少元素存放
 */
public class L_88 {

    public void merge(int[] nums1, int m, int[] nums2, int n) {
        int p1 = m - 1;
        int p2 = n - 1;
        int p = m + n -1;

        while (p1 >= 0 && p2 >= 0){
            // 如果p1中的元素小于p2中的元素，则num1末尾添加p2，p2--
            if(nums1[p1] < nums2[p2] ){
                nums1[p] = nums2[p2];
                p2 --;
            }else {
                nums1[p] = nums1[p1];
                p1--;
            }
            p--;
        }

        // 当p2还有剩余数据时，再添加
        while (p2 >= 0){
            nums1[p] = nums2[p2];
            p2--;
            p--;
        }
    }
}
